package main

import (
	"context"
	"fmt"
	"github.com/gin-gonic/gin"
	"golang.org/x/sync/errgroup"
	"net/http"
	"os"
	"os/signal"
	"syscall"
)

func main() {
	group, ctx := errgroup.WithContext(context.Background())


	r := initGin()
	group.Go(func() error {
		return r.Run(":9001")
	})
	group.Go(func() error {
		c := make(chan os.Signal, 1)
		signal.Notify(c, syscall.SIGINT, syscall.SIGTERM, syscall.SIGQUIT, syscall.SIGHUP)   //用户发送INTR字符(Ctrl+C)触发  ,   结束程序(可以被捕获、阻塞或忽略)

		return fmt.Errorf("signal : %s", <-c)
	})

	// 这段貌似可以不需要,但是要如何使用通用的方法拿到错误信息呢?
	var chErr chan error
	go func() {
		chErr <- group.Wait()
	}()

	select {
	case <- ctx.Done():
		fmt.Println("finish reason = ", ctx.Err())
	case err := <- chErr:
		fmt.Println("finish by group.Wait : ", err)
	}
}

// 初始化gin
func initGin() *gin.Engine {
	r := gin.New()
	r.GET("/hello", func(c *gin.Context) {
		c.String(http.StatusOK, "Hello World")
	})
	return r
}